package net;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 * 服务端
 * 1.实例化一个ServerSocket（）对象
 * 2.调用accept()方法，等待客户端的请求。若接受到客户端请求，建立了连接，则返回一个Sokcet对象
 */
public class Server {
    public static void main(String[] args){
        /*try {
            ServerSocket server=new ServerSocket(9988);//实例化ServerSocket（）对象
            System.out.println("服务器已启动！等待客户端请求！");
            Socket socket=server.accept();//等待客户端的请求。若接受到客户端请求，建立了连接，则返回一个Sokcet对象
            // 若没接受到客户端请求，程序会停在此处
            System.out.println("与客户端建立连接");
        } catch (IOException e) {
            //e.printStackTrace();
            System.out.println("端口被占用！");
        }*/

/**
 *一、客户端传输文件到服务端
 */
        /*try {
            ServerSocket server=new ServerSocket(9988);//实例化ServerSocket（）对象
            System.out.println("服务器已启动！等待客户端请求！");
            Socket socket=server.accept();//等待客户端的请求。若接受到客户端请求，建立了连接，则返回一个Sokcet对象
            // 若没接受到客户端请求，程序会停在此处
            System.out.println("与客户端建立连接");
            String cip=socket.getInetAddress().getHostAddress();//获取客户端IP
            System.out.println("ip:"+cip);//输出客户端IP
            System.out.println("port:"+socket.getPort());//获取客户端端口
            InputStreamReader isr=new InputStreamReader(socket.getInputStream());//字符流输入操作
            BufferedReader br=new BufferedReader(isr);
            String message=br.readLine();//从输入流读一行字符串
            while (!message.equals("bye")){//只要不输入bye就可以循读取字符
                System.out.println("cip说:"+message);
                message=br.readLine();//下一次读取输入流
            }
            br.close();
        } catch (IOException e) {
            //e.printStackTrace();
            System.out.println("端口被占用！");
        }*/

/**
 * 二、建立服务器与客户端的收发：服务器先收后发
 */
        /*try {
            ServerSocket server=new ServerSocket(9988);//实例化ServerSocket（）对象
            System.out.println("服务器已启动！等待客户端请求！");
            Socket socket=server.accept();//等待客户端的请求。若接受到客户端请求，建立了连接，则返回一个Sokcet对象
            // 若没接受到客户端请求，程序会停在此处
            System.out.println("与客户端建立连接");
            String cip=socket.getInetAddress().getHostAddress();//获取客户端IP
            System.out.println("ip:"+cip);//输出客户端IP
            System.out.println("port:"+socket.getPort());//获取客户端端口
            InputStreamReader isr=new InputStreamReader(socket.getInputStream());//字符流输入操作
            BufferedReader br=new BufferedReader(isr);
            String message=br.readLine();//从输入流读一行字符串
            Scanner kb=new Scanner(System.in);//键盘输入
            PrintWriter pw=new PrintWriter(socket.getOutputStream());
            while (!message.equals("bye")){//只要不输入bye就可以循读取字符
                System.out.println("cip说:"+message);
                String m=kb.nextLine();
                pw.write(m+"\n");
                pw.flush();
                message=br.readLine();//下一次读取输入流
            }
            br.close();
        } catch (IOException e) {
            //e.printStackTrace();
            System.out.println("端口被占用！");
        }*/


/**
 * 三、把收信息功能写到线程Recriver中，建立服务器与客户端的连续收发
 */
        try {
            ServerSocket server=new ServerSocket(9988);//实例化ServerSocket（）对象
            System.out.println("服务器已启动！等待客户端请求！");
            Socket socket=server.accept();//等待客户端的请求。若接受到客户端请求，建立了连接，则返回一个Sokcet对象
            // 若没接受到客户端请求，程序会停在此处
            System.out.println("与客户端建立连接");
            //new Receiver(socket,"客户端").start();//启动接收线程
            new Receiver(socket,"客户端").start();//启动接收线程
            String cip=socket.getInetAddress().getHostAddress();//获取客户端IP
            System.out.println("ip:"+cip);//输出客户端IP
            System.out.println("port:"+socket.getPort());//获取客户端端口
            Scanner kb=new Scanner(System.in);
            PrintWriter pw=new PrintWriter(socket.getOutputStream());
            String m=kb.nextLine();
            while (!m.equals("bye")){//只要不输入bye就可以循读取字符
                pw.write(m+"\n");//发信息
                pw.flush();
                m=kb.nextLine();
            }
            pw.close();
        } catch (IOException e) {
            //e.printStackTrace();
            System.out.println("端口被占用！");
        }
    }
}
